package com.t.bricks.bussiness.service.modulemanage.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.t.bricks.annotation.CacheClear;
import com.t.bricks.annotation.CacheLoad;
import com.t.bricks.annotation.CacheRebuild;
import com.t.bricks.bussiness.db.dao.modulemanage.ModuleManageDao;
import com.t.bricks.bussiness.db.entity.modulemanage.ModuleManage;
import com.t.bricks.bussiness.db.entity.modulemanage.base.ModuleManageBase;
import com.t.bricks.bussiness.service.modulemanage.ModuleManageService;
import com.t.bricks.model.MsgEmity;
import com.t.bricks.utils.function.data.ListUtil;
import com.t.bricks.utils.spring.ModuleUtil;

/**
 * 模块管理'ModuleManage表'基本业务操作类接口实现
 */
@Service
public class ModuleManageServiceImpl implements ModuleManageService<ModuleManage> {

	@Autowired
	private ModuleManageDao<ModuleManage> moduleManageDao;
	
	/**
	 * 新增
	 * @param moduleManage 模块管理 对象实体,注意:跨包访问时可能会是json字符串
	 * @return
	 */
	@Override
	@CacheRebuild(core="ModuleManage", type="tree", rebuildMethod="findByTree")
	public MsgEmity add(Object moduleManage) {
		MsgEmity me = ModuleUtil.objToEntity(moduleManage, ModuleManage.class);//转换数据,因为如果传递的是String,则可能是进行了跨包访问,要先用Json转换成实体对象
		if (!me.isSuccess()) {
			return me;
		}
		
		ModuleManage moduleManageData = me.getData();
		
		me = ModuleUtil.validDbEntityByAdd(moduleManageData);// 通用的基本数据验证,如果要进行比较复杂的数据验证则可以屏蔽掉此方法自行编写
		if (!me.isSuccess()) {
			return me;
		}
		
		me = ModuleUtil.validDbEntityRepeatByAdd((ModuleManageBase)moduleManageData, moduleManageDao);//查询数据库,验证数据是否有重复,因验证数据重复的方式比较复杂,直接在sql脚本中处理
		if (!me.isSuccess()) {// 在false下,如果返回8028则表示数据库查询异常,否则返回后4位是8026的数据,如xxx8026,从万位起表示从数据库中查询的结果
			String tmp = me.getData().toString();
			tmp = tmp.substring(tmp.length() -4, tmp.length());// 数据一定不小于4位
			return me.setData(tmp);// 发现重复数据后不进行其它业务处理则退出时,必须清理返回数据
		}
		
		moduleManageData.setsId(null);//清空记录编号
		
		synchronized(this) {//由于采用补漏的方式获取节点编号,因此在未保存前存在id冲突的可能
			me = moduleManageDao.newChildId(moduleManageData.getsPid());
			if (!me.isSuccess()) {
				return me;
			}
			
			String vNewId = me.getData();
			moduleManageData.setsId(vNewId);//补充id
			me = ModuleUtil.supplyDbEntityAttrByAdd(moduleManageData, vNewId, null);// 补充数据,如添加id、当前用户、当前时间等
			if (!me.isSuccess()) {
				return me;
			}
	
			//--提交数据保存--//
			return moduleManageDao.add(moduleManageData);
		}
	}

	/**
	 * 删除
	 * @param iVersion 数据版本号
	 * @param sId 表编号
	 * @return
	 */
	@Override
	@CacheRebuild(core="ModuleManage", type="tree", rebuildMethod="findByTree")
	public MsgEmity del(Integer iVersion, String sId) {
		if (null == sId || "".equals(sId.trim())) {
			return new MsgEmity(false, "信息编号参数错误，请刷新重试！", 8001);
		}
		
		if (null == iVersion || iVersion.intValue() < 1) {
			return new MsgEmity(false, "信息版本参数错误，其值应大于0！", 8002);
		}

		return moduleManageDao.del(sId, iVersion);
	}

	/**
	 * 修改
	 * @param moduleManage 模块管理 对象实体,注意:跨包访问时可能会是json字符串
	 * @return
	 */
	@Override
	@CacheRebuild(core="ModuleManage", type="tree", rebuildMethod="findByTree")
	public MsgEmity edit(Object moduleManage) {
		MsgEmity me = ModuleUtil.objToEntity(moduleManage, ModuleManage.class);//转换数据,因为如果传递的是String,则可能是进行了跨包访问,要先用Json转换成实体对象
		if (!me.isSuccess()) {
			return me;
		}
		
		ModuleManage moduleManageData = me.getData();
		
		me = ModuleUtil.validBaseDataByEdit(moduleManageData);// 通用的基本数据验证(编辑),如果要进行比较复杂的数据验证则可以屏蔽掉此方法自行编写
		if (!me.isSuccess()) {
			return me;
		}
		
		me = ModuleUtil.validDbEntityRepeatByEdit((ModuleManageBase)moduleManageData, moduleManageDao);// 查询数据库,验证数据是否有重复,因验证数据重复的方式比较复杂,直接在sql脚本中处理
		if (!me.isSuccess()) {// 在false下,如果返回8028则表示数据库查询异常,否则返回后4位是8026的数据,如xxx8026,从万位起表示从数据库中查询的结果
			String tmp = me.getData().toString();
			tmp = tmp.substring(tmp.length() -4, tmp.length());//数据一定不小于4位
			return me.setData(tmp);// 发现重复数据后不进行其它业务处理则退出时,必须清理返回数据
		}
		
		ModuleUtil.supplyDbEntityAttrByEdit(moduleManageData);// 补充数据
		
		//--提交数据保存--//
		return moduleManageDao.edit(moduleManageData);
	}
	
	/**
	 * 查询模块管理树信息(给前端返回树形结构权限数据)
	 * @return
	 */
	@Override
	@CacheLoad(core="ModuleManage", type="tree")
	public MsgEmity findByTree() {
		return findByTree(ModuleUtil.currentLoginUserId());//取当前登录用户
	}
	
	/**
	 * 查询字典表树信息(给前端返回树形结构权限数据)
	 * @param sUserId
	 * @return
	 */
	private MsgEmity findByTree(String sUserId) {
		String currentLoginUserId = ModuleUtil.currentLoginUserId();//取当前登录用户

		//--从缓存文件读取数据--//
		MsgEmity me = moduleManageDao.findByTree(null, currentLoginUserId);//读库
		if (!me.isSuccess()) {
			return me;
		}
		
		List<ModuleManage> list = me.getData();
		
		me = ListUtil.createTree(list, "00", "sId", "sPid", "childs");//通用方法构造树形结构
		if (!me.isSuccess()) {
			return me.setData(3100 + (Integer)me.getData());
		}
		
		list = me.getData();
		if (null == list || list.size() < 1) {
			return new MsgEmity(false, "获取树形数据信息为空！", 8001);
		}
		
		return MsgEmity.success(list, "树形数据查询成功");
	}
	
	/**
	 * 清理指定用户的缓存
	 * @param sUser 用户编号
	 * @return
	 */
	@Override
	@CacheClear(core="ModuleManage", type="tree")
	public MsgEmity clearCache(String sUser) {
		return MsgEmity.success(8999, "接受请求");
	}

	/**
	 * 保存模块对应的图标(系统菜单树)
	 * @param sId 选取的记录编号
	 * @param sIconStyle 图标的样式
	 * @return
	 */
	@Override
	@CacheRebuild(core="ModuleManage", type="tree", rebuildMethod="findByTree")
	public MsgEmity saveIcon(String sId, String sIconStyle) {
		if (sId == null || "".equals(sId)) {
			return new MsgEmity(false, "编号不能为空!", 8001);
		}
		
		if (sIconStyle == null || "".equals(sIconStyle)) {
			return new MsgEmity(false, "图标样式不能为空!", 8002);
		}
		
		return moduleManageDao.saveIcon(sId, sIconStyle);
	}
	
}
